{% extends '__base__.html' %}

{% block title %}编辑日志{% endblock %}

{% block beforehead %}
<!-- 
MVVM最早由微软提出来，它借鉴了桌面应用程序的MVC思想，在前端页面中，把Model用纯JavaScript对象表示：
<script>
    var blog = {
        name: 'hello',
        summary: 'this is summary',
        content: 'this is content...'
    };
</script>
View是纯HTML：
<form action="/api/blogs" method="post">
    <input name="name">
    <input name="summary">
    <textarea name="content"></textarea>
    <button type="submit">OK</button>
</form>
由于Model表示数据，View负责显示，两者做到了最大限度的分离。
把Model和View关联起来的就是ViewModel。ViewModel负责把Model的数据同步到View显示出来，还负责把View的修改同步回Model。
ViewModel如何编写？需要用JavaScript编写一个通用的ViewModel，这样，就可以复用整个MVVM模型了。
有许多成熟的MVVM框架，例如AngularJS，KnockoutJS等。我们选择Vue这个简单易用的MVVM框架来实现创建Blog的页面 -->
<script>

    var
        ID = '{{ id }}',
        action = '{{ action }}';

    function initVM(blog) {
        // 初始化Vue时，我们指定3个参数：
        // el：根据选择器查找绑定的View，这里是#vm，就是id为vm的DOM，对应的是一个 < div > 标签；
        // data：JavaScript对象表示的Model，我们初始化为{ name: '', summary: '', content: '' } ；
        // methods：View可以触发的JavaScript函数，submit就是提交表单时触发的函数。
        // 在<form>标签中，用几个简单的v-model，就可以让Vue把Model和View关联起来：
        var vm = new Vue({
            el: '#vm',
            data: blog,
            methods: {
                submit: function (event) {
                    event.preventDefault();
                    var $form = $('#vm').find('form');
                    $form.postJSON(action, this.$data, function (err, r) {
                        if (err) {
                            $form.showFormError(err);
                        }
                        else {
                            return location.assign('/api/blogs/' + r.id);
                        }
                    });
                }
            }
        });
        $('#vm').show();
    }

    $(function () {
        if (ID) {
            getJSON('/api/blogs/' + ID, function (err, blog) {
                if (err) {
                    return fatal(err);
                }
                $('#loading').hide();
                initVM(blog);
            });
        }
        else {
            $('#loading').hide();
            initVM({
                name: '',
                summary: '',
                content: ''
            });
        }
    });

</script>

{% endblock %}

{% block content %}

<div class="uk-width-1-1 uk-margin-bottom">
    <div class="uk-panel uk-panel-box">
        <ul class="uk-breadcrumb">
            <li><a href="/manage/comments">评论</a></li>
            <li><a href="/manage/blogs">日志</a></li>
            <li><a href="/manage/users">用户</a></li>
        </ul>
    </div>
</div>

<div id="error" class="uk-width-1-1">
</div>

<div id="loading" class="uk-width-1-1 uk-text-center">
    <span><i class="uk-icon-spinner uk-icon-medium uk-icon-spin"></i> 正在加载...</span>
</div>

<div id="vm" class="uk-width-2-3">
    <form v-on="submit: submit" class="uk-form uk-form-stacked">
        <!-- Form表单通过<form v-on="submit: submit">把提交表单的事件关联到submit方法。 -->
        <div class="uk-alert uk-alert-danger uk-hidden"></div>
        <div class="uk-form-row">
            <label class="uk-form-label">标题:</label>
            <div class="uk-form-controls">
                <!-- input的value和Model的name关联起来了 -->
                <input v-model="name" name="name" type="text" placeholder="标题" class="uk-width-1-1">
            </div>
        </div>
        <div class="uk-form-row">
            <label class="uk-form-label">摘要:</label>
            <div class="uk-form-controls">
                <textarea v-model="summary" rows="4" name="summary" placeholder="摘要" class="uk-width-1-1"
                    style="resize:none;"></textarea>
            </div>
        </div>
        <div class="uk-form-row">
            <label class="uk-form-label">内容:</label>
            <div class="uk-form-controls">
                <textarea v-model="content" rows="16" name="content" placeholder="内容" class="uk-width-1-1"
                    style="resize:none;"></textarea>
            </div>
        </div>
        <div class="uk-form-row">
            <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-save"></i> 保存</button>
            <a href="/manage/blogs" class="uk-button"><i class="uk-icon-times"></i> 取消</a>
        </div>
    </form>
</div>
<!-- 需要特别注意的是，在MVVM中，Model和View是双向绑定的。如果我们在Form中修改了文本框的值，可以在Model中立刻拿到新的值。试试在表单中输入文本，然后在Chrome浏览器中打开JavaScript控制台，可以通过vm.name访问单个属性，或者通过vm.$data访问整个Model： 
    双向绑定是MVVM框架最大的作用。借助于MVVM，我们把复杂的显示逻辑交给框架完成。由于后端编写了独立的REST API，所以，前端用AJAX提交表单非常容易，前后端分离得非常彻底。
-->
{% endblock %}